iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0

現今因為容器的盛行,許多的企業都導入了容器解決方案,使得佈署與開發都能加快速度。今天的內容是描述怎麼將專案的服務給進行容器化,並使用 docker-compose 進行服務佈署。

專案內容有 DB、Spring boot、React 等服務,以下是原始的佈署方式,但存在著許多問題

https://ithelp.ithome.com.tw/upload/images/20210902/20104688GcJq5lujJ1.png

以一個一台虛擬機內佈署這些服務來看

  1. 不必要的 Port 映射出來(MongoDB、swiftStorage)
  2. 服務和服務之間的溝通應該可以使用內部的服務發現機制,而不是透過映射處來的 Port 進行存取
  3. Nginx 服務可以容器化,原本是沒容器化
  4. 沒必要在同一台機器上做 master、slave

於是做了整理

https://ithelp.ithome.com.tw/upload/images/20210902/20104688lGC93N6C0d.png

將不必要的 Port 拿掉,透過服務發現方式進行服務存取,可以減少透過 ens33 網卡那邊的 NAT 轉換,將 Nginx 容器化進行更版之類都方便許多。

整體存取過程是 Client -----> ens33 存取 80 Port 藉由 NAT 和 routing 將流量導入 docker0 -----> 到 Nginx 容器 -----> 反向代理到 -----> Spring boot Application + React 進行網頁上的存取。

接下來是如何操作 docker ? 當時大四容器技術 docker 很紅,因此在拿時有稍微自幹一下這個東西,以下是常見操作

docker run 
docker images
docker ps
docker stop | start | restart
docker rm
docker logs -f 
docker exec

會了這些基本上一個服務就能跑起來使用了~。更體面一點使用 docker-compose 建構專案的服務,以下是一個 Spring boot 後端配 Nginx,Tomcat 預設 Port 是 8080 因此,nginx 在做反向代理時只要指定 web_server_be:8080,Client 到 Nginx 的流量都會被導到 web_server_be。

version: '3.7'
services: 
  backend: # 服務名稱
    container_name: web_server_be # 容器名稱
    image: Spring-boot:v1.2.3 # Image
    environment: # 環境變數
      - PROJECT_PROPERTIES={"db_username":"...","db_classname":"...","db_url":"..."}
    restart: always # 服務機制
  nginx_proxy:
    container_name: nginx
    image: nginx:latest
    volumes: # 掛載
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/cert:/etc/nginx/ssl/certs
      - ./nginx/sites-enabled:/etc/nginx/sites-enabled
    restart: always
    ports: # 映射到本機到容器的 Port
      - 80:80
      - 443:443
    depends_on: # 等待 backend 啟動後才能啟動
      - backend

啟動方式,前提下是要在該 docker-compose yaml 檔下執行否則要用 -f 指定該 yaml 路徑

docker-compose up -d # 在背景啟動服務
docker-compose stop
docker-compose ps

下個章節將會介紹使用前後端分離,當前的 Web 服務包含了前端和後端,其實在開發上會有一點不那麼適當,因為在做 CI/CD 的時候其實前端的改動跟後端其實關係不大,應當將他們分開,否則前端改動時連後端也要著做測試和建置。


上一篇
第一份軟體開發工作
下一篇
前後端分離
系列文
一個新鮮人如何完轉Spring boot與DevOps從0到10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言